/**
处理显示编辑客户入住，预订状态的页面
AUTHOR: YE 		SINCE:20110222		VERSINO:20110301 20:28
**/

var btnClass = 'btn';//生成的按钮默认使用的css样式名
var thClass = 'find_td01 fs14 fb';

//保存synDefaultDefaultCustomer方法，不修改的房价的房间ID的集合（key为房间ID，value为true）
var notChangePriceRoom = {};

var currentRoomTr;//当前编辑房间的tr

//初始化显示客户预订状态的弹出页面
function initRoomListTable( selectedRoomInfo,//保存所有被选中的的房间信息的数组
							allRoomInfo,//所有房间的ID
							startDate,//显示时间的第一天
							totalDay,//显示的总天数
							tableHeaderId,//表头tr标签的ID
							trTagIdHeader,//内容tr标签的ID头
							roomStatus,//所有房间的预订、入住的状态
							selectedNum//双击tr后，选中的天数（如果不填，则双击tr无效）
							){
	
	/** 把selectedRoomInfo对象中的属性添加到roomStatus中 **/								
	for(key in selectedRoomInfo){
		roomStatus.push(selectedRoomInfo[key]);
	}
				
	var startDateStr = startDate;//开始日期的字符串形式
	
	startDate = strToDate(startDate);//转换为日期对象			
	
	/** 生成 表头的日期部分 */
	//表头tr标签的id
	var tableHeader = document.getElementById(tableHeaderId);
	var currDate = startDate;
	for(var i = 0;i<totalDay; i++){
		currDate = date_add(startDate,i);
		
		var thElem = window.document.createElement("th");//创建一个td对象
		thElem.innerHTML = ((currDate.getMonth()+1)<10?'0'
		+(currDate.getMonth()+1):(currDate.getMonth()+1))+'<br>'
		+(currDate.getDate()<10?('0'+currDate.getDate()):currDate.getDate());
		thElem.className = thClass;
		tableHeader.appendChild(thElem);
	}
	
	/** 生成表体的td */
	var defaultRoomStatusInfo = roomStatusInfo['default'];
	var defaultTdStyle = defaultRoomStatusInfo.css;//默认td的css样式
	
	for(var i = 0;i<allRoomInfo.length; i++){
		
		var oneId = allRoomInfo[i]['roomId'];
		var trId = trTagIdHeader+oneId;
		var trElem = document.getElementById(trId);
		trElem.roomInfoObj = allRoomInfo[i];//保存房间信息
		
		currDate = startDate;
		for(var j = 0;j<totalDay; j++){
			currDate = date_add(startDate,j);
			var tdElem = window.document.createElement("td");//创建一个td对象
    		tdElem.date = currDate;//保存此td指代的日期
    		
    		//设置默认td的css样式
    		for(key in defaultTdStyle){
    			tdElem.style[key] = defaultTdStyle[key];
    		}
    		
			tdElem.innerHTML = '&nbsp;';
			
//    		tdElem.innerHTML = tdElem.date.getDate();
    		
    		trElem.appendChild(tdElem);
		}
	}//end for
	
	/**
	 * 把入住的房态放在最后面，
	 * 使其总能被显示
	 */
	roomStatus.sort(sortRoomStatus);
	
	/** 初始化表格的预订、入住状态显示 **/
	for(var i = 0;i<roomStatus.length; i++){
		var r = roomStatus[i];
		var trId = trTagIdHeader+r.roomId;
		var trElem = document.getElementById(trId);
		if(!trElem)
			continue;
		var dayCount = r.dayCount;//天数
		var oneRoomStartDate = strToDate(r.startDate);//状态开始日期
		try{		
		var nodes = trElem.childNodes;
		}catch(e){
			
			alert('trId:'+trId);
		}
		for(var j = 0;j<nodes.length;j++){
			var node = nodes[j];
			var nodeDate = node.date;
			if(!nodeDate)//如果不是表示日期的td
				continue;
			
			//如果在预订或入住范围内
			if(nodeDate.valueOf() >= oneRoomStartDate.valueOf()&&
			nodeDate.valueOf()<(date_add(oneRoomStartDate,dayCount)).valueOf()){
				var currentStyle = roomStatusInfo[r.status].css;
				//设置默认td的css样式
	    		for(key in currentStyle){
	    			node.style[key] = currentStyle[key];
	    		}
	    		node.innerHTML = roomStatusInfo[r.status].name;
			}
		}
	}//end for
	
	
	/** 如果有传选中的天数，即为编辑页面 */
	if(selectedNum){
		
		var cannotSelectRoomIds = {};//不能选择的房间ID
		var selectStartDate = startDate;//选择开始日期;
		var selectEndDate = date_add(selectStartDate,selectedNum-1);//选择结束日期;
		
		/** 找出所有不能选择的房间ID，并保存进cannotSelectRoomIds **/
		for(var i = 0;i<roomStatus.length; i++){
			var r = roomStatus[i];
			var oneRoomStartDate = strToDate(r.startDate);//状态开始日期
			var oneRoomEndDate = date_add(oneRoomStartDate,r.dayCount-1);//状态结束日期
			
			var oneRoomStatus = roomStatus[i].status;
			
			//如果是预订页面且为脏房的房态，则可以选择
			if(window.roomReservation&&oneRoomStatus == ROOM_STATUS.DIRTY)
				continue;
			
			//如果是维修房、锁定房的房态、则可以选择
			if(oneRoomStatus == ROOM_STATUS.REPAIR||
				oneRoomStatus == ROOM_STATUS.LOCK)
				continue;
			
			//如果时间段没交集，则可以选择
			if(selectEndDate.valueOf()<oneRoomStartDate.valueOf()||
				selectStartDate.valueOf()>oneRoomEndDate.valueOf()){
					
			}else{//时间段有交集，则此ID的房间不能选
				cannotSelectRoomIds[r.roomId]=true;
			}
		}
		
		/** 找出所有不能选择的房间ID，并保存进cannotSelectRoomIds **/
		for(var i = 0;i<allRoomInfo.length; i++){
		
			var oneId = allRoomInfo[i].roomId;
			
			if(cannotSelectRoomIds[oneId]){//如果不能选择
				continue;
			}
			
			var trId = trTagIdHeader+oneId;
			var trElem = document.getElementById(trId);
			trElem.roomId = oneId;//保存房间的ID
			
			trElem.ondblclick = function(){
				
				if(this.selected){//如果原来被选中，则取消选中
										
					var nodes = this.childNodes;
					for(var j = 0;j<nodes.length;j++){
						var node = nodes[j];
						var nodeDate = node.date;
						if(!nodeDate)//如果不是表示日期的td
							continue;
						
						//如果在预订或入住范围内
						if(nodeDate.valueOf() >= startDate.valueOf()&&
						nodeDate.valueOf()<(date_add(startDate,selectedNum)).valueOf()){
							var currentStyle = roomStatusInfo['default'].css;
							//设置默认td的css样式
				    		for(key in currentStyle){
				    			node.style[key] = currentStyle[key];
				    		}
			    			//node.innerHTML = roomStatusInfo['default'].name;
			    			node.innerHTML = node.oldInnerHTML;//还原原来的内容
			    			
			    			//还原旧的背景色
			    			if(node.oldBgColor)
								node.style['backgroundColor'] = node.oldBgColor;
							node.style['color'] = 'white'; 
						}
					}
					
					this.selected = false;
					
					
					delete(selectedRoomInfo[this.roomId+'_'+startDateStr]);
					
				}else{//如果原来没被选中，则选中
										
					var nodes = this.childNodes;
					for(var j = 0;j<nodes.length;j++){
						var node = nodes[j];
						
						//保存旧的背景色
						node.oldBgColor = node.style['backgroundColor'];
						
						var nodeDate = node.date;
						if(!nodeDate)//如果不是表示日期的td
							continue;
						
						//如果在预订或入住范围内
						if(nodeDate.valueOf() >= startDate.valueOf()&&
						nodeDate.valueOf()<(date_add(startDate,selectedNum)).valueOf()){
							var currentStyle = roomStatusInfo['selected'].css;
							//设置默认td的css样式
				    		for(key in currentStyle){
				    			node.style[key] = currentStyle[key];
				    		}
				    		node.oldInnerHTML = node.innerHTML;//保存原来的内容
			    			node.innerHTML = roomStatusInfo['selected'].name;
						}
					}
					
					this.selected = true;
					
					//把选中的房间ID同步到隐藏字段
					this.roomInfoObj['status']='selected';
					this.roomInfoObj['startDate']=startDateStr;
					this.roomInfoObj['dayCount']=selectedNum;
					
					selectedRoomInfo[this.roomId+'_'+startDateStr] = this.roomInfoObj;
				}
			}
		}
	}
}


//把对象的属性名连接成以“|”分隔的字符串并返回
function objAttrNameToStr(obj){
	var f = true;
	var s = '';
	for(attr in obj){
		if(f)
			f=false;
		else
			s+='|';
			
		s+=attr;
	}
	return s;
}

/**
 * 生成显示已选择的房间表格
 */
function initSelectedRoomListTable(tbodyId,//要生成表格内容的tableId
									selectedRoomInfo,//保存所有被选中的的房间信息的关联数组
									buttonInfo,//保存要生成按钮的关联数组
									guestGlobalInfo//保存与显示宾客相关信息的关联数组
									){
										
	/**
	 * 如果选择了协议单位，则房价使用协议价，
	 * 否则房价使用原房价。
	 */
	synAgreementUnitPrice(selectedRoomInfo);//保存所有被选中的的房间信息的关联数组
										
	//要生成表格内容的table
	var tableBody = g(tbodyId);
	removeAllRows(tableBody);//清空tbody中的所有行
	
	var isFirstRow = true;
	
	for(key in selectedRoomInfo){
		var o = selectedRoomInfo[key];
		var trElem = window.document.createElement("tr");//创建一个tr对象
		if(isFirstRow){//如果是第一行
			//保存第一行的tr为当前编辑房间的tr，以便加载页面时生成显示第一行房间所在客户信息的表格
			currentRoomTr = trElem;
			isFirstRow = false;
		}
		
		var oriPrice = parseFloat(o['price']);//原价
		var discount = parseFloat(o['discount']);//折扣
		
		addTdToTr(trElem,o['roomCode']);//房号
		
		//如果没传这个参数，即不用另起表格显示用户信息，则直接在本表格生成用户信息
		if(!guestGlobalInfo){
			//添加录入用户名的文本框
			addUserNameTdToTr(trElem,//当前行对象
							o);//保存一个房间信息的关联数组
		}
		
		addTdToTr(trElem,o['roomTypeName']);//房型
		
				
		//如果没传这个参数，即为当前为预订界面
		if(!guestGlobalInfo){
			addTdToTr(trElem,o['price']);//原价
		}else{//当前为入住界面
			//生成录入价格的td并添加到tr中
			addPriceInputTdToTr(trElem,//当前行对象
							o);
		}
		
		//如果没传这个参数，即不用另起表格显示用户信息，则直接在本表格生成用户信息
		if(!guestGlobalInfo){
			
			//生成折扣与折后价td并添加到tr中
			addDiscountTdToTr(trElem,//当前行对象
								o);//保存一个房间信息的关联数组
		}
							
		addTdToTr(trElem,o['startDate']);//起始时间
		addTdToTr(trElem,o['dayCount']);//天数
		
		//为tr标签生成保存一些与房间有关的信息
		trElem.oneRoomInfoObj = o;//保存此tr关联的房间信息的对象
		trElem.oneRoomInfoKey = key;//保存此tr关联的房间信息的对象在selectedRoomInfo中的key
		trElem.allRoomInfo = selectedRoomInfo;//保存所有被选中的的房间信息的关联数组
		trElem.guestGlobalInfo = guestGlobalInfo;//保存与显示宾客相关信息的关联数组
		
		if(buttonInfo){//如果要生成按钮
			var tdElem = window.document.createElement("td");//创建一个td对象
			for(var i = 0;i<buttonInfo.length;i++){
				var oneBtnInfo = buttonInfo[i];
				//生成一个按钮并返回 
				var btnElem = createButton(oneBtnInfo,trElem);
				tdElem.appendChild(btnElem);
			}
			trElem.appendChild(tdElem);
		}
		
		//为表格追加一行
		tableBody.appendChild(trElem);
		
		
		if(isNullObj(o.guests)){//如果没宾客信息，添加一个默认的宾客信息
			
			o.guests = [];
			var oneGuestInfo;
			
			if(window.setDefaultCustomer&&window.defaultCustomer){//如果需要添加默认宾客信息
				oneGuestInfo = deepClone(window.defaultCustomer);
			}else{
				oneGuestInfo = {};
			}
			
			o.guests.push(oneGuestInfo);
		}
		
	}
	
	//显示宾客信息的表格默认显示第一个房间的宾客信息
	if(currentRoomTr&&guestGlobalInfo)
		editOneRow(currentRoomTr);
}

//生成录入价格的td并添加到tr中
function addPriceInputTdToTr(trElem,//当前行对象
							oneRoomInfo){//保存一个房间信息的关联数组
	
	var price = oneRoomInfo['price'];//用户名
	
	var tdElem = window.document.createElement("td");//创建一个折扣td对象
	
	//录入折扣的文本框
	var inputElem = window.document.createElement("input");//创建一个td对象
	if(price)
		inputElem.value = price;
	inputElem.trElem = trElem;
	inputElem.oneRoomInfo = oneRoomInfo;
	
	//失去焦点时，校验录入的折扣是否正确
	inputElem.onblur = function(){
		this.oneRoomInfo['price'] = this.value;
	}
	
	//把td添加到行中
	tdElem.appendChild(inputElem);
	trElem.appendChild(tdElem);
	
	return trElem;
}

//生成折扣与折后价td并添加到tr中
function addUserNameTdToTr(trElem,//当前行对象
							oneRoomInfo){//保存一个房间信息的关联数组
	
	var guestName = oneRoomInfo['guestName'];//用户名
	
	var tdElem = window.document.createElement("td");//创建一个折扣td对象
	
	//录入折扣的文本框
	var inputElem = window.document.createElement("input");//创建一个td对象
	if(guestName)
		inputElem.value = guestName;
	inputElem.trElem = trElem;
	inputElem.oneRoomInfo = oneRoomInfo;
	
	//失去焦点时，校验录入的折扣是否正确
	inputElem.onblur = function(){
		this.oneRoomInfo['guestName'] = this.value;
	}
	
	//把td添加到行中
	tdElem.appendChild(inputElem);
	trElem.appendChild(tdElem);
	
	return trElem;
}

//生成折扣与折后价td并添加到tr中
function addDiscountTdToTr(trElem,//当前行对象
							oneRoomInfo){//保存一个房间信息的关联数组
	
	var oriPrice = oneRoomInfo['price'];//原价
	var discount = oneRoomInfo['discount'];//折扣
	
	var discountTdElem = window.document.createElement("td");//创建一个折扣td对象
	var discountPriceTdElem = window.document.createElement("td");//创建一个折后价td对象
	discountPriceTdElem.innerHTML = oriPrice*discount/100;
	
	
	//录入折扣的文本框
	var inputElem = window.document.createElement("input");//创建一个td对象
	inputElem.value = discount;
	inputElem.trElem = trElem;
	inputElem.oriDiscount = discount;//如果用户输入的折扣不对，用此值来还原
	//保存 折后价td对象 进折扣td对象，以便折扣文本框被修改时，更新折后价td对象显示
	inputElem.discountPriceTdElem = discountPriceTdElem;
	
	/**
	如果此变量为真，则允许用户手动修改每间房间的折扣。
	如果此变量为假或不存在，则不允许用户手动修改折扣。
	*/
	if(!window.canInputDiscount)
		inputElem.readOnly = true;
	
	//失去焦点时，校验录入的折扣是否正确
	inputElem.onblur = function(){
		var discount = parseFloat(this.value);
		
		//如果录入的折扣正确
		if(discount!=NaN&&discount>=0){
			
			//同步对象中的数据
			this.trElem.oneRoomInfoObj['discount'] = discount;
			//折扣文本框被修改时，更新折后价td对象显示
			this.discountPriceTdElem.innerHTML = 
			discount*this.trElem.oneRoomInfoObj['price']/100;			
			
		}else{
			alert('折扣必需为数字！');
			this.value = this.oriDiscount;
		}
	}
	
	//把td添加到行中
	discountTdElem.appendChild(inputElem);
	trElem.appendChild(discountTdElem);
	trElem.appendChild(discountPriceTdElem);
	
	return trElem;
}

//生成一个按钮并返回 
function createButton(oneBtnInfo,//包含一个按钮信息的关联数组
						trElem){//tr元素
	var btnElem = window.document.createElement('input');//创建一个button对象
	btnElem.type = 'button';
	btnElem.value = oneBtnInfo.btnName;
	btnElem.className = btnClass;
	
	if(trElem.oneRoomInfoObj&&trElem.oneRoomInfoObj.noDelete
	&&(btnElem.value.indexOf('删')!=-1)){//如果按钮所在行不允许删除
		btnElem.disabled = true;
	}else{
		btnElem.onclick = function(){
			oneBtnInfo.btnFun(trElem);
		};
	}
	
	return btnElem;
}

/**
 * 为trElem添加一个内容为tdInnerHTML的td
 */
function addTdToTr(trElem,//tr对象
					tdInnerHTML//要添加的td的内容
					){
						
	var tdElem = window.document.createElement("td");//创建一个td对象
	tdElem.innerHTML = tdInnerHTML;
	trElem.appendChild(tdElem);
	return trElem;
}

//删除一行的方法，trElem为当前按钮所在行的tr对象
function deleteOneRow(trElem){
	delete(trElem.allRoomInfo[trElem.oneRoomInfoKey]);//删除本行的相关信息
	removeElem(trElem);//删除一行
	
	if(trElem==currentRoomTr&&trElem.guestGlobalInfo){//如果当前被删除的为正在编辑宾客信息的行，则清空显示入住宾客信息的表格的内容
		removeAllRows(g(trElem.guestGlobalInfo.guestTbodyId));
		currentRoomTr = undefined;
	}
}

//在显示某房间所有宾客的表格中，删除一行的方法，trElem为当前按钮所在行的tr对象
function deleteOneGuestRow(trElem){
	trElem.oneRoomGuests.pop(trElem.oneGuestInfo);//删除本行的相关信息
	removeElem(trElem);//删除一行
}

//添加一行进显示宾客信息的表格，并使用oneGuestInfo去初始化此行中表单元素的初始值
function addOneRowToGuestTbody(trElem,//显示排房的表格的一行
								oneGuestInfo){//保存一个宾客信息的对象
	
	if(!currentRoomTr){//如果没有当前编辑的房间，则返回
		alert('请选择需要添加宾客的房间！');
		return;
	}
									
	var guestGlobalInfo = trElem.guestGlobalInfo;//保存与显示宾客相关信息的关联数组
	var guestTbody = g(guestGlobalInfo.guestTbodyId);//插入显示宾客信息的tbody对象
	var formEleInfoArray = guestGlobalInfo.formEleInfoArray;//生成表格列时，就按此数组的顺序生成
	var oneRoomInfoObj = trElem.oneRoomInfoObj;//保存此tr关联的房间信息的对象
	var guests = oneRoomInfoObj.guests;
	
	
	//key为formEleInfoArray中子元素的name，value为formEleInfoArray中子元素的集合
	var formElemInfoMap = guestGlobalInfo.formElemInfoMap;
							
	var guestTrElem = window.document.createElement("tr");//创建一个tr对象
	guestTrElem.oneRoomGuests = guests;//保存整个房间的客人信息
	
	if(!oneGuestInfo){//如果没宾客信息，添加一个空的宾客信息
		
		if(window.setDefaultCustomer&&window.defaultCustomer){//如果需要添加默认宾客信息
			oneGuestInfo = deepClone(window.defaultCustomer);
		}else{
			oneGuestInfo = {};
		}
		
		guests.push(oneGuestInfo);
	}
	guestTrElem.oneGuestInfo = oneGuestInfo;//一个具体住客的信息
	
	//添加房号td
	var roodCodeTdElem = window.document.createElement("td");//创建一个td对象
	roodCodeTdElem.innerHTML = oneRoomInfoObj['roomCode'];
	guestTrElem.appendChild(roodCodeTdElem);//把td添加到tr中
	
	for(var j=0;j<formEleInfoArray.length;j++){
		var tdElem = window.document.createElement("td");//创建一个td对象
		
		var oneFormElemInfo =  formEleInfoArray[j];//包含一个表单信息的关联数组
		
		//取出初始化表单元素的值
		var tagName = oneFormElemInfo.tagName.toUpperCase();
		var handleFun = oneFormElemInfo.handleFun;//处理事件的方法引用
		var formElemName = oneFormElemInfo.name;//表单元素的name
		
		//初始化表单元素
		var formElem = window.document.createElement(tagName);//创建一个表单元素对象
		formElem.handleFun = handleFun;//处理事件方法引用
		formElem.name = formElemName;
		
		if(oneGuestInfo){//如果有宾客信息
			formElem.oneGuestInfo = oneGuestInfo;//保存一行宾客信息
		}
		
		//如果是下拉菜单
		if(tagName=='SELECT'){
			var optionInfoArray = oneFormElemInfo.optionGroup;//保存下拉菜单项信息的数组
			
			//把数组中关于下拉菜单项的信息添加到下拉菜单中
			addOptToSelect(formElem,//select 元素的name或id或对象
							optionInfoArray//保存下拉菜单项信息的数组
							);
			
			formElem.onchange = function(){
				this.handleFun(this);
			}
			
		}else{//如果是textarea或input元素
			
			formElem.onblur = function(){
				this.handleFun(this);
			}
		}
		
		//alert(formElemName);
		var formElemValue = oneGuestInfo[formElemName];//表单元素的值
		//alert(formElemValue);
		if(formElemValue)
			formElem.value = formElemValue;
		else{
			oneGuestInfo[formElemName] = formElem.value;
		}
		
		tdElem.appendChild(formElem);//把表单元素添加到td中
		guestTrElem.appendChild(tdElem);//把td添加到tr中
		
	}//end for 循环一次，生成一个td
	
	
	//添加最后一列的按钮
	var buttonInfo = guestGlobalInfo.guestButtonInfo;
	if(buttonInfo){//如果要生成按钮
		var tdElem = window.document.createElement("td");//创建一个td对象
		for(var i = 0;i<buttonInfo.length;i++){
			var oneBtnInfo = buttonInfo[i];
			//生成一个按钮并返回 
			var btnElem = createButton(oneBtnInfo,guestTrElem);
			tdElem.appendChild(btnElem);
		}
		guestTrElem.appendChild(tdElem);
	}
	
	guestTbody.appendChild(guestTrElem);//添加刚生成的行进表格
}


//刷新显示宾客信息table的方法，trElem为当前按钮所在行的tr对象
function editOneRow(trElem){
	
	
	currentRoomTr = trElem;//保存当前编辑房间的tr进全局变量，便于添加一行按钮调用
	
	var guestGlobalInfo = trElem.guestGlobalInfo;//保存与显示宾客相关信息的关联数组	
	//插入显示宾客信息的tbody对象
	var guestTbody = g(guestGlobalInfo.guestTbodyId);
	removeAllRows(guestTbody);//清空tbody原有的内容
	
	var oneRoomInfoObj = trElem.oneRoomInfoObj;//保存此tr关联的房间信息的对象
	var guests = oneRoomInfoObj.guests;
	if(!guests){//如果没有宾客信息，则生成一个空数组
		guests = [];
		oneRoomInfoObj.guests = guests;
	}
	
	//循环一次生成一行
	for(var i=0;i<guests.length;i++){
		
		var oneGuestInfo = guests[i];//一个具体住客的信息

		//添加一行进显示宾客信息的表格，并使用oneGuestInfo去初始化此行中表单元素的初始值
		addOneRowToGuestTbody(trElem,//显示排房的表格的一行
							oneGuestInfo);//保存一个宾客信息的对象
		
	}//end for 循环一次生成一行
	
	//如果没有一个宾客，则生成一个空行给用户填
	/**
	if(guests.length==0)
		//添加一行进显示宾客信息的表格，并使用oneGuestInfo去初始化此行中表单元素的初始值
		addOneRowToGuestTbody(trElem);//显示排房的表格的一行
	**/
							
}

//处理显示客人信息的表格表单元素的onblur或onchange事件
function handleGuestTableInput(formElem//触发onblur或onchange事件的表单元素
								){
	var name = formElem.name;								
	formElem.oneGuestInfo[name] = formElem.value;//把本表单的值同步进全局对象中
}

//在guestGlobalInfo中添加一个key为formEleInfoArray中子元素的name，value为formEleInfoArray中子元素的集合
function initFormElemInfoMapOfGuestGlobalInfo(guestGlobalInfo//保存与显示宾客相关信息的关联数组
											){
	var formEleInfoArray = guestGlobalInfo.formEleInfoArray;
	guestGlobalInfo.formElemInfoMap = {};
	
	for(var i=0;i<formEleInfoArray.length;i++){
		var o = formEleInfoArray[i];
		var name = o.name;
		guestGlobalInfo.formElemInfoMap[name] = o;
	}
}

//校验预订排房后输入的入住宾客信息
function validateReservationRoomInfo(){

	var rs = '';
	var rsObj = {};

	if(isNullObj(selectedRoomInfo))
		return rs;
		
	for(key in selectedRoomInfo){
		var oneRoomInfo = selectedRoomInfo[key];
		
		var discount = oneRoomInfo.discount;
		var discountMsg = v_float(discount,'房价',true);
		if(discountMsg)
			rsObj[discountMsg]=true;

		var guestName = oneRoomInfo['guestName'];
		var msg = checkStrMaxByte(guestName,//要校验的字符串
					'姓名',//校验不通过时拼在返回消息的消息头
					40,//最大字节数
					true);//true则不允许为空
		if(msg){
			rsObj[msg]=true;
		}
		
	}
	
	for(msg in rsObj){
		rs+=msg;
	}
	return rs;
}

//校验入住排房后输入的入住宾客信息
function validateRoomsGuestInfo(){

	var rs = '';
	var rsObj = {};

	if(isNullObj(selectedRoomInfo))
		rsObj['至少选择一个房间!\r\n']=true;
		
	for(key in selectedRoomInfo){
		var oneRoomInfo = selectedRoomInfo[key];
		
		var price = oneRoomInfo.price;
		var priceMsg = v_float(price,'房价',true);
		if(priceMsg)
			rsObj[priceMsg]=true;
		
		var oneGuests = oneRoomInfo['guests'];
		if(isNullObj(oneGuests)){
			rsObj['每个房间至少录入一个宾客!\r\n']=true;
			continue;
		}
		for(var i=0;i<oneGuests.length;i++){
			var oneGuest = oneGuests[i];

			var oneGuestName = oneGuest['oneGuestName'];
			var msg = checkStrMaxByte(oneGuestName,//要校验的字符串
						'姓名',//校验不通过时拼在返回消息的消息头
						40,//最大字节数
						true);//true则不允许为空

			if(msg){
				rsObj[msg]=true;
			}
			if(!oneGuest['guestCertificateCode']){
				rsObj['证件号:不能为空!\r\n']=true;
			}
			if(!oneGuest['guestNative']){
				rsObj['籍贯:不能为空!\r\n']=true;
			}
			if(oneGuest['guestCertificateType']=='1'){
				var v = oneGuest['guestCertificateCode'];
				if(!v||(v.length!=18&&v.length!=15))
					rsObj['身份证号:长度不正确！\r\n']=true;
			}
		}
	}
	
	for(msg in rsObj){
		rs+=msg;
	}
	return rs;
}

//添加住客按钮点击事件
function addGuestBtnOnclick(){
	
	if(!currentRoomTr)
		return;
	
	var oneRoomInfoObj = currentRoomTr.oneRoomInfoObj;//保存此tr关联的房间信息的对象
	var guests = oneRoomInfoObj.guests;
	if(guests.length+1>guestGlobalInfo.maxGuestPerRoom){
		alert('此房间添加的宾客数已经达到'+guests.length+'个，不能继续添加！');
		return;
	}
	
	//添加一行进显示宾客信息的表格，并使用oneGuestInfo去初始化此行中表单元素的初始值
	 addOneRowToGuestTbody(currentRoomTr//当前编辑房间的tr
						);
}

//根据房态排序
function sortRoomStatus(a,b){
	
	var aStatus = a['status'];
	var bStatus = b['status'];
	
	if(aStatus == bStatus)
		return 0;
	
	if(aStatus==ROOM_STATUS.CHECK_IN||aStatus=='selected')//把入住的排在最后面
		return 1;
	else if(aStatus==ROOM_STATUS.RESERVATION&&bStatus!=ROOM_STATUS.CHECK_IN)//预订排在第二后
		return 1;
	else
		return -1;
}

/**
 * 如果选择了协议单位，则房价使用协议价，
 * 否则房价使用原房价。
 * 
 * 注意：如果是预订界面，也会同步协议单位宾客姓名
 */
function synAgreementUnitPrice(selectedRoomInfo//保存所有被选中的的房间信息的关联数组
								){
									
	//如果不需要切换到协议单位价格
	if(!window.roomPriceInfo)
		return;
									
	//修改标题									
	if(window.isAgreementUnit)
		document.getElementById('priceTitle').innerHTML = '协议价';
	else
		document.getElementById('priceTitle').innerHTML = '原房价';
									
	for(key in selectedRoomInfo){
		var o = selectedRoomInfo[key];//一个房间信息
		var oneRoomTypePriceInfo = window.roomPriceInfo[o['roomTypeId']];
		
		var roomId = o.roomId;
		
		try{
		
		if(notChangePriceRoom[roomId])
			continue;
		}catch(e){
		}
		
		if(window.isAgreementUnit){//如果是协议单位
			o['price'] = oneRoomTypePriceInfo['agreementPrice'];
			if(window.defaultGuestName)
				o['guestName'] = window.defaultGuestName;
		}else{//如果不是协议单位
			o['price'] = oneRoomTypePriceInfo['oriPrice'];
			if(window.defaultGuestName)
				o['guestName'] = window.defaultGuestName;
		}
	}
}

/**
 * 用默认的宾客信息defaultCustomer，同步选择的房间信息selectedRoomInfo，并初始化页面显示
 */
function synDefaultDefaultCustomer(selectedRoomInfo
									){
	if(!window.defaultCustomer)
		return;
		
	for(k in selectedRoomInfo){
		var oneRoomInfo = selectedRoomInfo[k];//拿到一个房间的信息
		
		if(!oneRoomInfo.guests)
			continue;
			
		for(var i=0;i<oneRoomInfo.guests.length;i++){//拿到一个房间的所有宾客
			var oneGuest = oneRoomInfo.guests[i];
				
			//同步集合中的值
			for(key in window.defaultCustomer){
				var value = window.defaultCustomer[key];
				oneGuest[key] = value;
			}
		}
	}
	
	//刷新当前房间的宾客信息
	if(currentRoomTr)
		editOneRow(currentRoomTr);
}

/**
 * 保存当前已选择的房间(包含在变量selectedRoomInfo中)进变量notChangePriceRoom中
 */
function saveCurrChooseRoomIds(winObj,selectedRoomInfo){
	winObj.notChangePriceRoom = {};
	for(key in selectedRoomInfo){
		var oneRoomInfo = selectedRoomInfo[key];
		var roomId = oneRoomInfo['roomId'];
		winObj.notChangePriceRoom[roomId] = true;
	}
}


//****************
//校验数字 应为整数或浮点数
//****************
function v_float(value,msgHeader,notNull){
			
	var header='';
	if(msgHeader)//如果用户有输入消息头
		header=msgHeader;
	if((!value)&&notNull)//如果无输入值，且不允许为空
		return header+"不能为空！\r\n";
	else if(!value)//如果无输入值，且允许为空，则让校验通过
		return '';
		
	var regExp = /^\d+(\.\d+)?$/;
			
	if(!regExp.test(value)){
		return header+"应为正数！\r\n";
	}else{
  		return "";
	}
}

//保存selectedRoomInfo中旧的折扣
/*
function saveOldDiscount(selectedRoomInfo){
	
	for(key in selectedRoomInfo){
		
		var o = selectedRoomInfo[key];
		o.oriDiscount = o.discount;
	}
}
*/

//保存selectedRoomInfo中旧的折扣
function changeAllDiscount(selectedRoomInfo,newDiscount){
	
	for(key in selectedRoomInfo){
		var o = selectedRoomInfo[key];
		o.discount = newDiscount;
	}
}

//用刚进入页面时的原折扣替换当前折扣
/*
function rollbackAllDiscount(selectedRoomInfo){
	
	for(key in selectedRoomInfo){
		var o = selectedRoomInfo[key];
		o.discount = o.oriDiscount;
	}
}
*/